package GameServer;

import java.util.*;
import java.util.Map.*;

/**
 * WorldMap houdt slechts de continenten en landen bij met hun eigenaar en 
 * aantal legers voor een bepaald spel.
 */
public class WorldMap
{
    /**
     *
     */
    protected Map<Integer, Continent> m_Continents = Collections.synchronizedMap(new HashMap<Integer, Continent>());
    /**
     *
     */
    protected int m_TotalAmountOfLands = 0;
    
    /**
     * Constructor voor het aanmaken van een nieuwe WorldMap.
     */
    public WorldMap()
    {
    }
    
    /**
     * Voegt een continent toe aan de WorldMap.
     * @param continentid
     * @param name name
     * @param bonus bonus
     */
    public void addContinent(int continentid, String name, int bonus)
    {
        m_Continents.put(new Integer(continentid), new Continent(continentid, name, bonus));
    }

    /**
     * Voegt een land toe aan een continent.
     * @param continentid
     * @param landid landid
     * @param name name
     */
    public void addLand(int continentid, int landid, String name)
    {
        m_Continents.get(continentid).getLands().add(new Land(landid, name));
        m_TotalAmountOfLands++;
    }

    /**
     * Geeft het totaal aantal landen terug.
     * @return
     * @returns totaal aantal landen
     */
    public int getAmountOfLands()
    {
        return m_TotalAmountOfLands;
    }

    /**
     * Geeft het continent terug dat bij het opgegeven id hoort.
     * @param id continentid
     * @return
     * @returns continent
     */
    public Continent getContinentById(int id)
    {
        Iterator<Entry<Integer, Continent>> it = m_Continents.entrySet().iterator();
        while (it.hasNext())
        {
            Continent c = it.next().getValue();
            if (c.getId() == id)
                return c;
        }
        return null;
    }
    
    /**
     * Geeft het land terug dat bij dit id hoort.
     * @param id landid
     * @return
     * @returns land
     */
    protected Land getLand(int id)
    {
        Iterator<Entry<Integer, Continent>> it = m_Continents.entrySet().iterator();
        while (it.hasNext())
        {
            Continent c = it.next().getValue();
            Land l = c.getLand(id);
            if (l != null)
                return l;
        }
        return null;
    }

    /**
     * Geeft het targetLand een nieuwe eigenaar (newOwner) met een legergrootte van armySize.
     * @param targetLand land
     * @param newOwner nieuwe eigenaar
     * @param armySize legergrootte
     */
    public void changeOwner(Land targetLand, Session newOwner, int armySize)
    {
        getLand(targetLand.m_Id).setOwner(newOwner);
        getLand(targetLand.m_Id).setArmies(armySize);
    }
    
    /**
     * Lijst van alle landen.
     * @return
     * @returns contenten
     */
    public List<Land> getLands()
    {
        List<Land> lands = new ArrayList<Land>();
        Iterator<Continent> it = m_Continents.values().iterator();
        while (it.hasNext())
        {
            Iterator<Land> it0 = it.next().getLands().iterator();
            while (it0.hasNext())
            {
                lands.add(it0.next());
            }
        }
        return lands;
    }
    
    /**
     * Lijst van alle continenten.
     * @return
     * @returns contenten
     */
    public Collection<Continent> getContinents()
    {
	return m_Continents.values();
    }
}
